<!doctype html>
<html lang="zh-cn">
  <head>
    <title>MySQL数据库的条件查询 // JW Blog</title>
    <meta charset="utf-8" />
    <meta name="generator" content="Hugo 0.60.1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="John Doe" />
    <meta name="description" content="" />
    <link rel="stylesheet" href="https://duyi111.gitee.io/css/main.min.f90f5edd436ec7b74ad05479a05705770306911f721193e7845948fb07fe1335.css" />

    
    <meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="MySQL数据库的条件查询"/>
<meta name="twitter:description" content="1.聚合函数 1.1聚合函数的介绍  聚合函数又叫做组函数，通常是对表中的数据进行统计和计算，一般结合分组（group by）来使用，用于统计和计算分组数据。 常用的聚合函数：  count(col)：表示求指定列的总行数 max(col)：表示求指定列的最大值 min(col)：表示求指定列的最小值 sum(col)：表示求指定列的和 avg(col)：表示求指定列的平均值    1.2 例：求总行数 # 返回非null数据的总行数 select count(height) from students; # 返回总行数，包含null值记录 select count(*) from students; 1.3 例：求最大值 # 查询男生的编号最大值 select max(id) from students where gender = 1; 1.4 例：求最小值 # 查询未删除的学生最小编号 select min(id) from students where is_delete = 0; 1.5 例：求和 # 查询男生的总身高 select sum(height) from students where gender = 1; 1.6 例：求平均值 # 求男生的平均身高，聚合函数不统计null值，平均身高有误 # 求男生的平均身高，包含身高是null的 select avg(ifnull(height, 0)) from students where gender = 1;  ifnull函数：表示判断指定字段的值是否为null，如果为空使用自己提供的值  1."/>

    <meta property="og:title" content="MySQL数据库的条件查询" />
<meta property="og:description" content="1.聚合函数 1.1聚合函数的介绍  聚合函数又叫做组函数，通常是对表中的数据进行统计和计算，一般结合分组（group by）来使用，用于统计和计算分组数据。 常用的聚合函数：  count(col)：表示求指定列的总行数 max(col)：表示求指定列的最大值 min(col)：表示求指定列的最小值 sum(col)：表示求指定列的和 avg(col)：表示求指定列的平均值    1.2 例：求总行数 # 返回非null数据的总行数 select count(height) from students; # 返回总行数，包含null值记录 select count(*) from students; 1.3 例：求最大值 # 查询男生的编号最大值 select max(id) from students where gender = 1; 1.4 例：求最小值 # 查询未删除的学生最小编号 select min(id) from students where is_delete = 0; 1.5 例：求和 # 查询男生的总身高 select sum(height) from students where gender = 1; 1.6 例：求平均值 # 求男生的平均身高，聚合函数不统计null值，平均身高有误 # 求男生的平均身高，包含身高是null的 select avg(ifnull(height, 0)) from students where gender = 1;  ifnull函数：表示判断指定字段的值是否为null，如果为空使用自己提供的值  1." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://duyi111.gitee.io/post/mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/" />
<meta property="article:published_time" content="2020-02-03T17:54:53+08:00" />
<meta property="article:modified_time" content="2020-02-03T17:54:53+08:00" />


  </head>
  <body>
    <header class="app-header">
      <a href="https://duyi111.gitee.io/"><img class="app-header-avatar" src="/avatar.jpg" alt="John Doe" /></a>
      <h1>JW Blog</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vehicula turpis sit amet elit pretium.</p>
      <div class="app-header-social">
        
      </div>
    </header>
    <main class="app-container">
      
  <article class="post">
    <header class="post-header">
      <h1 class ="post-title">MySQL数据库的条件查询</h1>
      <div class="post-meta">
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
  <title>calendar</title>
  <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
          Feb 3, 2020
        </div>
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-clock">
  <title>clock</title>
  <circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
          2 min read
        </div></div>
    </header>
    <div class="post-content">
      <h2 id="1">1.聚合函数</h2>
<h4 id="11">1.1聚合函数的介绍</h4>
<ul>
<li>聚合函数又叫做组函数，通常是对表中的数据进行统计和计算，一般结合分组（group by）来使用，用于统计和计算分组数据。</li>
<li>常用的聚合函数：
<ul>
<li>count(col)：表示求指定列的总行数</li>
<li>max(col)：表示求指定列的最大值</li>
<li>min(col)：表示求指定列的最小值</li>
<li>sum(col)：表示求指定列的和</li>
<li>avg(col)：表示求指定列的平均值</li>
</ul>
</li>
</ul>
<h4 id="12-">1.2 例：求总行数</h4>
<pre><code># 返回非null数据的总行数
select count(height) from students;
# 返回总行数，包含null值记录
select count(*) from students;
</code></pre><h4 id="13-">1.3 例：求最大值</h4>
<pre><code># 查询男生的编号最大值
select max(id) from students where gender = 1;
</code></pre><h4 id="14-">1.4 例：求最小值</h4>
<pre><code># 查询未删除的学生最小编号
select min(id) from students where is_delete = 0;
</code></pre><h4 id="15-">1.5 例：求和</h4>
<pre><code># 查询男生的总身高
select sum(height) from students where gender = 1;
</code></pre><h4 id="16-">1.6 例：求平均值</h4>
<pre><code># 求男生的平均身高，聚合函数不统计null值，平均身高有误
# 求男生的平均身高，包含身高是null的
select avg(ifnull(height, 0)) from students where gender = 1;
</code></pre><ul>
<li><code>ifnull</code>函数：表示判断指定字段的值是否为<code>null</code>，如果为空使用自己提供的值</li>
</ul>
<h4 id="17-">1.7 聚合函数的特点</h4>
<ul>
<li>聚合函数默认忽略字段为<code>null</code>的记录，要想列值为<code>null</code>的记录也参与计算，必须使用<code>ifnull</code>函数对<code>null</code>只能做替换</li>
</ul>
<h2 id="2">2.分组查询</h2>
<h4 id="21-">2.1 分组查询的介绍</h4>
<ul>
<li>分组查询就是将查询结果按照指定字段进行分组，字段中数据相等的分为一组</li>
</ul>
<h4 id="22-group-by">2.2 group by的使用</h4>
<ul>
<li><code>group by</code>可用于单个字段分组，也可用于多个字段分组
<pre><code># 根据gender字段来分组
select gender from students group by gender;
# 根据name和gender字段进行分组
select name, gender from students group by name, gender;
</code></pre></li>
</ul>
<h4 id="23-group-by--groupconcat">2.3 group by + group_concat()的使用</h4>
<ul>
<li>group_concat(字段名)：统计每个分组指定字段的信息集合，每个信息之间使用逗号进行分割
<pre><code># 根据gender字段进行分组，查询gender字段和分组的name字段信息
select gender, group_concat(name) from students group by gender;
</code></pre></li>
</ul>
<h4 id="24-group-by">2.4 group by+聚合函数的使用</h4>
<pre><code># 统计不同性别的人的平均年龄
select gender, avg(age) from students group by gender;
</code></pre><h4 id="25-group-by--hanving">2.5 group by + hanving的使用</h4>
<ul>
<li><code>having</code>作用和<code>where</code>类似都是过滤数据的，但<code>having</code>是过滤分组数据的，只能用于<code>group by</code>
<pre><code># 根据gender字段进行分组，统计分组条数大于2的
select gender,count(*) from students group by gender having count(*) &gt; 2;
</code></pre></li>
</ul>
<h4 id="26-group-by--with-rollup">2.6 group by + with rollup的使用</h4>
<ul>
<li>with rollup的作用是：在最后记录后面新增一行，显示select查询是聚合函数的统计和计算结果
<pre><code># 根据gender字段进行分组，汇总总人数
select gender, count(*) from students group by gender with rollup;
</code></pre></li>
</ul>
<h4 id="27-">2.7 小结</h4>
<ul>
<li><code>group up</code>根据指定的一个或者多个字段对数据进行分组</li>
<li><code>group_concat(字段名)</code>函数是统计每个分组指定字段的信息集合</li>
<li>聚合函数在和<code>group by</code>结合使用时，聚合函数统计和计算的是每个分组的数据</li>
<li><code>having</code>是对分组数据进行条件过滤</li>
<li><code>with rollup</code>在最后记录后面新增一行，显示<code>select</code>查询是聚合函数的统计和计算结果</li>
</ul>
<h2 id="3">3.连接查询&ndash;内连接</h2>
<h4 id="31-">3.1 连接查询的介绍</h4>
<ul>
<li>连接查询可以实现多个表的查询，当查询的字段数据来自不同的表就可以使用连接查询来完成。</li>
<li>连接查询可以分为：
<ul>
<li>1.内连接查询</li>
<li>2.左连接查询</li>
<li>3.右连接查询</li>
<li>4.自连接查询</li>
</ul>
</li>
</ul>
<h4 id="32-">3.2 内连接查询</h4>
<ul>
<li>查询两个表中符合条件的共有记录</li>
<li>内连接查询语句格式：
<pre><code>select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2;
</code></pre><ul>
<li><code>inner join</code>就是内连接查询关键字</li>
<li><code>on</code>就是连接查询条件</li>
</ul>
</li>
</ul>
<h4 id="33-">3.3 小结</h4>
<ul>
<li>内连接使用<code>inner join ..on .., on</code>表示两个表的连接查询条件</li>
<li>内连接根据连接查询条件取出两个表的“交集”</li>
</ul>
<h2 id="4">4.连接查询&ndash;左查询</h2>
<h4 id="41-">4.1 左连接查询的介绍</h4>
<ul>
<li>以左表为主根据条件查询右表数据，如果根据条件查询右表数据不存在使用<code>null</code>值填充</li>
<li>左连接查询语法格式：
<pre><code>select 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2;
</code></pre><ul>
<li><code>left join</code>就是左连接查询关键字</li>
<li><code>on</code>就是连接查询条件</li>
<li>表1是左表</li>
<li>表2是右表</li>
</ul>
</li>
</ul>
<h4 id="42-">4.2 小结</h4>
<ul>
<li>左连接使用<code>left join .. on .., on</code>表示两个表的连接查询条件</li>
<li>左连接以左表为主根据条件查询右表数据，右表数据不存在使用<code>null</code>值填充</li>
</ul>
<h2 id="5">5.连接查询&ndash;右连接</h2>
<h4 id="51-">5.1 右连接查询的介绍</h4>
<ul>
<li>以右表为主根据条件查询左表数据，如果根据条件查询左表数据不存在使用<code>null</code>值填充</li>
<li>右连接查询语法格式：
<pre><code>select 字段 from 表1 right join 表2 on 表1.字段1 = 表2.字段2;
</code></pre><ul>
<li><code>right join</code>就是右连接查询关键字</li>
<li><code>on</code>就是连接查询条件</li>
<li>表1是左表</li>
<li>表2是右表</li>
</ul>
</li>
</ul>
<h4 id="52-">5.2 小结</h4>
<ul>
<li>右连接使用<code>right join .. on .., on</code>表示两个表的连接查询条件</li>
<li>
<ul>
<li>右连接以右表为主根据条件查询左表数据，左表数据不存在使用<code>null</code>值填充</li>
</ul>
</li>
</ul>
<h2 id="6">6.连接查询&ndash;自连接</h2>
<h4 id="61-">6.1 自连接查询的介绍</h4>
<ul>
<li>左表和右表是同一个表，根据连接查询条件查询表中的数据</li>
<li>自连接查询必须对表起别名</li>
<li>自连接的语法格式：
<pre><code>select 字段 from 表 as 别名1 inner join 表 as 别名2 on 别名1.字段1 = 别名2.字段2 where 条件;
</code></pre></li>
</ul>
<h4 id="62-">6.2 小结</h4>
<ul>
<li>自连接查询就是把一张表模拟成左右两张表，然后进行连表查询</li>
<li>自连接就是一种特殊的连接方式，连接的表还是本身这张表</li>
</ul>
<h2 id="7">7.子查询</h2>
<h4 id="71-">7.1 子查询的介绍</h4>
<ul>
<li>在一个select语句中，嵌入了另一个select语句，那么被嵌入的select语句称为子查询语句，外部那个select语句则被称为主查询</li>
<li>主查询和子查询的关系：
<ul>
<li>子查询是嵌入到主查询中</li>
<li>子查询是辅助主查询的，要么充当条件，要么充当数据源</li>
<li>子查询是可以独立存在的语句，是一条完整的select语句</li>
</ul>
</li>
</ul>
<h4 id="72-">7.2 子查询的使用</h4>
<ul>
<li>例1：查询大于平均年龄的学生
<pre><code>select * from students where age &gt; (select avg(age) from students);
</code></pre></li>
<li>例2：查询学生在班的所在班级名字
<pre><code>select name from classes where id in (select cls_id from students where cls_id is not null); 
</code></pre></li>
</ul>
<h4 id="73-">7.3 小结</h4>
<ul>
<li>子查询是一个完整的SQL语句，子查询被嵌入到一对小括号里面</li>
</ul>
<h2 id="8">8.数据库设计之三范式</h2>
<h4 id="81-">8.1 数据库设计之三范式的介绍</h4>
<ul>
<li>范式：对设计数据库提出的一些规范，目前有迹可循的共有8种范式，一般遵守3范式即可</li>
<li>第一范式：强调的是列的原子性，即列不能够再分为其他列</li>
<li>第二范式：满足第一范式，另外包含两部分内容，一是表必须有一个主键，二是非主键字段必须完全依赖于主键，而不能只依赖于主键的一部分</li>
<li>第三范式：满足第二范式，另外非主键列必须直接依赖于主键，不能存在传递依赖。即不能存在：非主键列A依赖于非主键列B，非主键列B依赖于主键情况</li>
</ul>
<h4 id="82-">8.2 小结</h4>
<ul>
<li>范式就是设计数据库的一些通用规范
<ul>
<li>第一范式强调字段是最小单位，不可再分</li>
<li>第二范式强调在第一范式的基础上必须要有主键和非主键字段必须完全依赖于主键，也就是说不能部分依赖</li>
<li>第三范式强调在第二范式的基础上非主键字段必须直接依赖于主键，也就是说不能传递依赖（间接依赖）</li>
</ul>
</li>
<li>E-R模型由实体、属性、实体之间的关系构成，主要用来描述数据库中表结构</li>
<li>开发流程是先画出E-R模型，然后根据三范式设计数据库中的表结构</li>
</ul>
<h2 id="9sql">9.外键SQL语句的编写</h2>
<h4 id="91-">9.1 外键约束的作用</h4>
<ul>
<li>外键约束：对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证，数据如果不合法则更新和插入会失败，保证数据的有效性</li>
</ul>
<h4 id="92-">9.2 对于已经存在的字段添加外键约束</h4>
<pre><code>alter table 从表 add foreign key(外键字段) references 主表(主键字段);
</code></pre><h4 id="93-">9.3 删除外键约束</h4>
<pre><code># 需要先获取外键约束名称，该名称系统会自动生成，可以通过查看表创建语句来获取名称
show create table 表名;
# 获取名称之后就可以根据名称来删除外键约束
alter table 表名 drop foreign key 外键名;
</code></pre><h4 id="94-">9.4 小结</h4>
<ul>
<li>添加外键约束：
<pre><code>alter table 从表 add foreign key(外键字段) references 主表(主键字段);
</code></pre></li>
<li>删除外键约束：
<pre><code>alter table 表名 drop foreign key 外键名;
</code></pre></li>
</ul>

    </div>
    <div class="post-footer">
      
    </div>
  </article>

    </main>
  </body>
</html>
